# -*- coding: utf-8 -*-

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.db import connection
from django.conf import settings
import json

'''
	Т.к. MySQL не поддерживает рекурсивные запросы, пришлось написать функцию на питоне,
	которая рекурсивно опрашивает все федеральные округа в поисках детишек, 
	необходимо в том случае, если пользователь выбирет не конечную область а например федеральный округ, или всю РФ
'''
def findChild(inId, resList):
	resList.append(str(inId))
	cursor = connection.cursor()
	query = "SELECT id from territory WHERE parent_id = %s" % str(inId)
	cursor.execute(query)
	for row in cursor.fetchall():
		findChild(row[0], resList)


'''
	Основная функции лоигки отчёта, и его рендера.

	логически разделена на 2ветки, если идёт POST запрос или GET запрос

		POST: POST запрос, будет выполняться в том случа если пользователь воспользовался кнопкой "Обновить данные",
	тогда в параметра запроса мы будем иметь дату начала, конца, и федеральную еденицу по которым нужно сформировать выборку.
	Таблица statistics содержит все интересующие нас данные, необходимо только узнать "имена", вместо id, Больниц, Болезней, И федеральных еденицу
	для того что бы узнать "имена" больниц и болезней, я использую left outer join, а для поиска имени ФЕ, использую подзапрос прямо в списке полей,
	с поиском по ID (просто для разнообразия), можно было все 4 таблицы склеить join'ом.
	Далее пробегаемся по результату запроса и записываем результаты в ассоциотивный масив, который после преобразования в JSON стректуру записывается в файл,
	который будет "съеден" jquery datagrid для отображения на странице. Так же, для отображения дат текущего отчёта, эти параметры отправляются в рендеринг страницы.

		GET: В случае GET запроса(загрузка страницы в браузере),
	мы просто отображаем страницу со старыми(построенными в последдний раз параметрами). Здесь
	так же можно было строить отчёт заново, например использую в качестве данных текущий месяц,
	или используя какие ниубудь другие параметры по умолчанию
'''
@csrf_exempt
def buildReport(request):
	# "Выуживание параметров и запроса"
	if request.method == 'POST':
		dtFrom = '20130101'
		dtTo = '20130331'
		territory_id = '1'
		if 'dtFrom' in request.POST:
			dtFrom = request.POST['dtFrom']
		if 'dtTo' in request.POST:
			dtTo = request.POST['dtTo']
		if 'territory' in request.POST:
			territory_id = request.POST['territory']

		# Рекурсивный поиск всех детищек
		resList = []
		findChild(territory_id, resList)

		resultTbl = {
			"total":0,
			"rows":[]
		}
		cursor = connection.cursor()
		query = """SELECT
(select territory.name from territory where id = hospital.terr_id),
hospital.name,
disease.name,
statistics.patients, 
statistics.issued
from statistics left outer join hospital on statistics.hospital_id = hospital.id left outer join disease on statistics.disease_id = disease.id
where statistics.date between '%s' and '%s' and hospital.terr_id in (%s)
order by statistics.date, hospital.name""" % (dtFrom, dtTo, ','.join(resList))
		cursor.execute(query)	# выполнение составленного запроса

		for row in cursor.fetchall():	# цикл который пробежит по всем строчка в результирующем запросе.
			resultTbl['total'] += 1
			resultTbl['rows'].append({	# добавление параметров в ассоциотивный массив
					'subjectName'	:	row[0],
					'hospitalName'	:	row[1],
					'diseaseName'	:	row[2],
					'patiensCnt'	:	row[3],
					'issuedCnt'		:	row[4],
					'trend'			:	row[4] - row[3]
				})

		pathToJson = settings.PATH_TO_JSON+'/2.json'	# записываем полученный массив в качестве JSON в соответсвующий файл
		f = open(pathToJson, 'w')
		f.write(json.dumps(resultTbl))
		f.close()
		return render_to_response('reportPage.html', {	'dtFrom' 	: 	dtFrom, # рендер страницы и отправка в браузер
														'dtTo'		:	dtTo})

	else:	 # обработка GET запроса.
		return render_to_response('reportPage.html', {})